//https://acm.hdu.edu.cn/showproblem.php?pid=1231
//题意：给一串长为k的数，要求输出最大的连续序列和，并输出这个连续数列的首尾两个数
//思路：dp[i][0]表示i位置不取，dp[i][1]表示取，状态转移方程为dp[i][0]=max(dp[i-1][0],dp[i-1][1]),dp[i][1]=max(a[i],dp[i-1][1]+a[i]);
//找首尾则直接判断dp[i][1]与a[i]和最后答案的关系
#include<bits/stdc++.h>
using namespace std;
int main(){
    int k;
    while(~scanf("%d",&k)){
        if(k==0) return 0;
        int dp[10005][2]={0},a[10005];
        bool flag=1;
        for(int i=1;i<=k;i++){
            scanf("%d",&a[i]);
            if(a[i]>=0) flag=0;
        }
        if(flag){
            printf("0 %d %d\n",a[1],a[k]);
            continue;
        }
        for(int i=1;i<=k;i++){
            dp[i][0]=max(dp[i-1][0],dp[i-1][1]);
            dp[i][1]=max(a[i],dp[i-1][1]+a[i]);
        }
        int l,r;
        for(int i=1;i<=k;i++){
            if(dp[i][1]==a[i]){
                l=i;
            }
            if(dp[i][1]==max(dp[k][0],dp[k][1])){
                r=i;
                break;
            }
        }
        // for(int i=1;i<=k;i++){
        //     // dp[i][0]=max(dp[i-1][0],dp[i-1][1]);
        //     // dp[i][1]=max(a[i],dp[i-1][1]+a[i]);
        //     printf("%d ",dp[i][0]);
        // }
        // printf("\n");       
        // for(int i=1;i<=k;i++){
        //     // dp[i][0]=max(dp[i-1][0],dp[i-1][1]);
        //     // dp[i][1]=max(a[i],dp[i-1][1]+a[i]);
        //     printf("%d ",dp[i][1]);
        // }
        // printf("\n");   
        printf("%d %d %d\n",max(dp[k][0],dp[k][1]),a[l],a[r]);
    }
}//交不了不保真